package cn.xuqiudong.snippet.shiro;

import org.apache.shiro.session.InvalidSessionException;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.SessionKey;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;

/**
 * 描述:
 *
 * @author Vic.xu
 * @since 2025-05-30 15:39
 */
//@Configuration
public class ShiroConfig {

    // 5分钟内不更新session
    private static final long DURATION = 5 * 60 *1000L;

    /**
     * 重写 SessionManager  的 重写touch()方法，降低Session更新的频率 ，其他设置略
     * @param sessionDAO
     * @return
     */
    public SessionManager sessionManager(RedisSessionDao sessionDAO) {
        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager() {
            @Override
            public void touch(SessionKey key) throws InvalidSessionException {
                Session session = doGetSession(key);
                if (session != null) {
                    long oldTime = session.getLastAccessTime().getTime();
                    // 更新访问时间
                    session.touch();
                    long newTime = session.getLastAccessTime().getTime();
                    // 如果两次访问的时间间隔大于5分钟，主动持久化Session
                    if (newTime - oldTime > DURATION) {
                        // TODO 可加入是否心跳url判断 比如 消息弹窗 ,(已经在filter中加入了忽略更新最后访问时间的判断了)
                        onChange(session);
                    }
                }
            }
        };

        sessionManager.setSessionDAO(sessionDAO); // 绑定SessionDAO

        SimpleCookie sessionIdCookie = new SimpleCookie("sessionId");
        sessionIdCookie.setPath("/");
        // 单位：秒数
        sessionIdCookie.setMaxAge(8 * 60 * 60);
        // 绑定Cookie模版
        sessionManager.setSessionIdCookie(sessionIdCookie);
        sessionManager.setSessionIdUrlRewritingEnabled(false);
        sessionManager.setGlobalSessionTimeout(60 * 60 * 1000);
        sessionManager.setSessionValidationSchedulerEnabled(false);
        sessionManager.setSessionValidationInterval(2 * 60 * 60 * 1000);
        sessionManager.setDeleteInvalidSessions(true);

        return sessionManager;
    }


}
